home *** CD-ROM | disk | FTP | other *** search
- /*
- * MandelVroom 2.0
- *
- * (c) Copyright 1987,1989 Kevin L. Clague, San Jose, CA
- *
- * All rights reserved.
- *
- * Permission is hereby granted to distribute this program's source
- * executable, and documentation for non-comercial purposes, so long as the
- * copyright notices are not removed from the sources, executable or
- * documentation. This program may not be distributed for a profit without
- * the express written consent of the author Kevin L. Clague.
- *
- * This program is not in the public domain.
- *
- * Fred Fish is expressly granted permission to distribute this program's
- * source and executable as part of the "Fred Fish freely redistributable
- * Amiga software library."
- *
- * Permission is expressly granted for this program and it's source to be
- * distributed as part of the Amicus Amiga software disks, and the
- * First Amiga User Group's Hot Mix disks.
- *
- * contents: this file contains the code to open and close the contour
- * palette tool. It also contains the code that implements the contour
- * commands.
- */
-
- #include "mandp.h"
-
- UBYTE ContOpen;
-
- struct Window *ContWind;
-
- BYTE ContTitle[80];
-
- struct NewWindow NewCont = {
- 0,200-80, /* start position */
- 320,200, /* width, height */
- (UBYTE) 0, (UBYTE) -1, /* detail pen, block pen */
- NULL, /* IDCMP flags */
- /* MandWind flags */
- WINDOWCLOSE | WINDOWDRAG | WINDOWDEPTH | NOCAREREFRESH | SMART_REFRESH |
- REPORTMOUSE,
- (struct Gadget *) NULL, /* first gadget */
- (struct Image *) NULL, /* user checkmark */
- (UBYTE *) NULL, /* window title */
- (struct Screen *) NULL, /* pointer to screen */
- (struct BitMap *) NULL, /* pointer to superbitmap */
- 80,80,320,200, /* sizing */
- CUSTOMSCREEN /* type of screen */
- };
-
-
- SHORT Ceiling = 1023;
-
- SHORT NumContours = NUMCONTS;
- SHORT FirstContour = 0;
- SHORT SaveFirstCont = 0;
-
- int CurContour;
-
- struct Gadget *ContGadget[DISPCONTS];
- struct Gadget *SelGadget[DISPCONTS];
-
- UBYTE Pattern[NUMCONTS+4];
- SHORT PattSize;
-
- static struct Gadget *ModGadget;
-
- int BarHotSpot;
-
- LONG BarTop;
- LONG BarBot;
- LONG BarLeft;
- LONG BarRight;
- LONG BarWidth;
- LONG BarBoxTop;
- LONG BarBoxBot;
-
- int ScaledFirst;
-
- struct ContHoriz {
- int CmdLeft;
- int BarLeft;
- int BarWidth;
- int PenLeft;
- int PenWidth;
- };
-
- struct ContVert {
- int CmdTop;
- int BarTop;
- int BarHeight;
- int PenTop;
- int PenHeight;
- };
-
- static struct ContHoriz Horiz_I = { 3, 8, 262, 8, 6*33 };
- static struct ContHoriz Horiz_II = { 3, 8, 524, 8,12*32 + 4};
- static struct ContVert Verticle_I = { 11, 31, 10, 47, 42 };
- static struct ContVert Verticle_II = { 11, 31, 14, 52, 82 };
-
- static struct ContHoriz *CurH = &Horiz_I;
- static struct ContVert *CurV = &Verticle_I;
-
-
- /*
- * Contour related commands
- */
-
- /* Paint Command */
-
- PaintCmd(Msg)
- struct IntuiMessage *Msg;
- {
- ReColor( CurPict );
- DisplayBeep(screen);
-
- if ( CurPict->DrawPict ) {
- ZoomBox( CurPict );
- }
- }
-
- SelContCmd(Msg)
- struct IntuiMessage *Msg;
- {
- struct Gadget *gadget;
-
- gadget = (struct Gadget *) Msg->IAddress;
-
- SetCurCont(GADG_NUM(gadget->GadgetID));
- }
-
- SetHeightCmd(Msg)
- struct IntuiMessage *Msg;
- {
- struct Window *Window;
- static struct Gadget *gadget;
- struct PropInfo *propinfo;
- static int knobhit;
-
- Window = Msg->IDCMPWindow;
-
- switch( Msg->Class ) {
-
- case GADGETDOWN:
- gadget = (struct Gadget *) Msg->IAddress;
- propinfo = (struct PropInfo *) gadget->SpecialInfo;
-
- if (knobhit = propinfo->Flags & KNOBHIT) {
- ModifyIDCMP(Window, Window->IDCMPFlags | MOUSEMOVE);
- State = SETHEIGHTSTATE;
- } else {
- SetContourHeight(gadget);
- }
- break;
-
- case MOUSEMOVE:
- SetContourHeight(gadget); /* potentio */
- break;
-
- case GADGETUP:
- if (knobhit) {
- ModifyIDCMP(Window, Window->IDCMPFlags & ~MOUSEMOVE);
- ModAll();
- } else {
- SetContourHeight(gadget); /* potentio */
- ShowValid();
- }
- State = IDLESTATE;
- break;
- }
- }
-
- SetContCmd(Msg) /* user can set height or pen */
- struct IntuiMessage *Msg;
- {
- struct Window *Window;
- struct Gadget *gadget;
- struct Picture *Pict;
-
- Window = Msg->IDCMPWindow;
- gadget = (struct Gadget *) Msg->IAddress;
-
- switch( Msg->Class ) {
-
- case GADGETDOWN:
- switch( WIND_TYPE(gadget->GadgetID) ) {
-
- case CONTYPE:
- if (gadget->GadgetID == CONTSET) {
-
- SetToPointer();
- State = SETCONTSTATE;
- }
- break;
-
- case PALTYPE:
- if (GADG_TYPE(gadget->GadgetID) == PALPENS) {
-
- State = IDLESTATE;
- SetContourPen( GADG_NUM(gadget->GadgetID) );
- }
- break;
- }
- break;
-
- case MOUSEBUTTONS: /* selecting height from the picture */
-
- if (Msg->Code == SELECTDOWN) {
- Pict = (struct Picture *) Window->UserData;
- if ( Pict ) {
- State = IDLESTATE;
- DoWindowPick(Pict,MouseX,MouseY);
- }
- }
- break;
- }
- }
-
- SmoothContCmd(Msg) /* Smooth heights between two pens */
- struct IntuiMessage *Msg;
- {
- struct Gadget *gadget;
- int t;
-
- /* Need contour selection to complete */
-
- gadget = (struct Gadget *) Msg->IAddress;
-
- if (Msg->Class == GADGETDOWN) {
-
- if (gadget->GadgetID == CONTSMTH) { /* Smooth command gadget */
-
- SetToPointer();
- State = SMOOTHCONTSTATE;
- } else {
-
- t = GADG_TYPE(gadget->GadgetID);
-
- if (t == CONTSELS || t == CONTPOTS) {
-
- t = GADG_NUM(gadget->GadgetID);
-
- /* smooth to last does decrement by one */
-
- if (t == CONTLAST)
- *(CurPict->Heights + t) = 0x7fff;
-
- SmoothContours(CurContour, t);
- State = IDLESTATE;
- }
- }
- }
- }
-
- CutContCmd(Msg) /* Cut Pens between two contours */
- struct IntuiMessage *Msg;
- {
- struct Gadget *gadget;
- int t;
-
- /* Need contour selection to complete */
-
- gadget = (struct Gadget *) Msg->IAddress;
-
- if (Msg->Class == GADGETDOWN) {
-
- if (gadget->GadgetID == CONTCUT) { /* Cut command gadget */
-
- SetToPointer();
- State = CUTCONTSTATE;
- } else {
-
- t = GADG_TYPE(gadget->GadgetID);
-
- if (t == CONTSELS || t == CONTPOTS) {
-
- t = GADG_NUM(gadget->GadgetID);
-
- CopyPattern( CurContour, t);
- DeleteContours(CurContour, t);
- State = IDLESTATE;
- }
- }
- }
- }
-
- CopyContCmd(Msg) /* Copy Pens between two contours */
- struct IntuiMessage *Msg;
- {
- struct Gadget *gadget;
- int t;
-
- /* Need contour selection to complete */
-
- gadget = (struct Gadget *) Msg->IAddress;
-
- if (Msg->Class == GADGETDOWN) {
- if (WIND_TYPE(gadget->GadgetID) == CONTYPE) {
-
- if (gadget->GadgetID == CONTCOPY) { /* Copy command gadget */
-
- SetToPointer();
- State = COPYCONTSTATE;
- } else {
-
- t = GADG_TYPE(gadget->GadgetID);
-
- if (t == CONTSELS || t == CONTPOTS) {
-
- CopyPattern( CurContour, GADG_NUM(gadget->GadgetID));
- State = IDLESTATE;
- }
- }
- } else
- if (WIND_TYPE(gadget->GadgetID) == PALTYPE) {
- SetPenPattern(CurPen, GADG_NUM(gadget->GadgetID));
- State = IDLESTATE;
- }
- }
- }
-
- PasteContCmd(Msg) /* Paste pens into contours */
- struct IntuiMessage *Msg;
- {
- struct Gadget *gadget;
- int t;
-
- /* Need contour selection to complete */
-
- gadget = (struct Gadget *) Msg->IAddress;
-
- if (Msg->Class == GADGETDOWN) {
-
- if (gadget->GadgetID == CONTPASTE) { /* Paste command gadget */
-
- SetToPointer();
- State = PASTECONTSTATE;
- } else {
-
- t = GADG_TYPE(gadget->GadgetID);
-
- if (t == CONTSELS || t == CONTPOTS) {
-
- PastePattern( CurContour, GADG_NUM(gadget->GadgetID));
- State = IDLESTATE;
- }
- }
- }
- }
-
- CeilingCmd(Msg) /* Respond to ceiling gadget */
- struct IntuiMessage *Msg;
- {
- struct Gadget *gadget;
- struct PropInfo *PropInfo;
- ULONG VertPot;
-
- extern SHORT Ceiling;
-
- if ( Msg->Class == GADGETUP ) {
-
- /* Need gadget up to complete */
-
- gadget = (struct Gadget *) Msg->IAddress;
- PropInfo = (struct PropInfo *) gadget->SpecialInfo;
-
- VertPot = PropInfo->VertPot;
- VertPot ^= 0xffff;
- VertPot += 1;
- Ceiling = VertPot * CurPict->MaxIteration >> 16;
-
- ModAll();
- State = IDLESTATE;
- }
- }
-
- SlideBarCmd(Msg)
- struct IntuiMessage *Msg;
- {
- struct Window *Window;
- static SavedState;
-
- Window = Msg->IDCMPWindow; /* had better be ContWind */
-
- switch( Msg->Class ) {
-
- case MOUSEBUTTONS: /* slide is starting */
- switch( Msg->Code ) {
-
- case SELECTDOWN: /* ImmediateCmd() filters */
- if (InBarBox()) {
- StartBarDrag();
- ModifyIDCMP(Window, Window->IDCMPFlags | MOUSEMOVE);
- SavedState = State;
- State = SLIDEBARSTATE;
- }
- break;
-
- case SELECTUP: /* slide is stoping */
- if (State == SLIDEBARSTATE) {
- ModAll();
- ModifyIDCMP(Window, Window->IDCMPFlags & ~MOUSEMOVE);
- State = SavedState;
- }
- break;
- }
- break;
-
- case MOUSEMOVE:
- DragBarBox(); /* slide the bar */
- break;
- }
- }
-
- ContNum(num)
- int num;
- {
- if (num == 32)
- return(255);
- else
- return(num+FirstContour);
- }
-
- RefreshContours()
- {
- if ( ContWind ) {
-
- Ceiling = CurPict->MaxIteration;
- DrawColorBox( ScaledFirst );
- DrawColorBar();
- ReDispPens();
- ModAll();
- }
- }
-
- InBarBox()
- {
- return(MouseX >= BarLeft + ScaledFirst &&
- MouseX <= BarLeft + BarWidth + ScaledFirst &&
- MouseY >= BarBoxTop &&
- MouseY <= BarBoxBot );
- }
-
- StartBarDrag()
- {
- BarHotSpot = MouseX - BarLeft - ScaledFirst;
- }
-
- DrawColorBar()
- {
- register LONG x,s,sx;
- register LONG dx = XScale + 1;
-
- register struct RastPort *Rp = ContWind->RPort;
-
- register UBYTE *ColorPtr = CurPict->Pens;
-
- sx = BarLeft;
-
- for (x = 0; x < NumContours; x++ ) {
-
- SetAPen( Rp, (long) *ColorPtr++ );
-
- for (s = 0; s < dx; s++) {
-
- Move(Rp, sx, BarTop );
- Draw(Rp, sx++, BarBot );
- }
- }
- DrawColorBox( ScaledFirst );
- }
-
- DrawColorBox( Contour )
- int Contour;
- {
- register LONG Left = BarLeft + Contour;
-
- DrawBox( ContWind, Left, BarBoxTop, Left + BarWidth, BarBoxBot);
- }
-
- DragBarBox()
- {
- register int CurX;
- static int OldCurX;
-
- CurX = MouseX;
-
- if (CurX == OldCurX)
- return;
-
- OldCurX = CurX;
-
- if ( CurX < BarLeft + BarHotSpot )
- CurX = BarLeft + BarHotSpot;
- else
- if ( CurX > BarRight - BarWidth + BarHotSpot )
- CurX = BarRight - BarWidth + BarHotSpot;
-
- DrawColorBox( ScaledFirst );
- DrawContBox( CurContour, NORMALPEN );
-
- ScaledFirst = (CurX - BarLeft - BarHotSpot);
- FirstContour = ScaledFirst >> XScale;
-
- DrawColorBox( ScaledFirst );
- DrawContBox( CurContour, HIGHLIGHTPEN );
-
- ReDispPens();
- }
-
- SetContourPen( Pen )
- USHORT Pen;
- {
- register struct Image *Image;
-
- Image = (struct Image *) SelGadget[ CurContour ]->GadgetRender;
-
- Image = Image->NextImage;
- Image->PlaneOnOff = Pen;
-
- RefreshGList( SelGadget[ CurContour ], ContWind, NULL, 1);
-
- *(CurPict->Pens + CurContour + FirstContour) = Pen;
-
- UpdateColorBar( Pen );
- }
-
- UpdateColorBar( Pen )
- USHORT Pen;
- {
- register LONG ContourPos;
- register UBYTE Overlap;
- register LONG x, sx;
-
- register struct RastPort *Rp = ContWind->RPort;
-
- ContourPos = ((CurContour + FirstContour) << XScale);
-
- Overlap =
- ContourPos == ScaledFirst || ContourPos == ScaledFirst + BarWidth;
-
- if ( Overlap )
- DrawColorBox( ScaledFirst );
-
- sx = BarLeft + ((CurContour + FirstContour) << XScale);
-
- SetAPen( Rp, (long) Pen );
-
- for (x = 0; x < XScale + 1; x++) {
-
- Move(Rp, sx, BarTop );
- Draw(Rp, sx++, BarBot );
- }
-
- if ( Overlap )
- DrawColorBox( ScaledFirst );
- }
-
- SetCurCont(ContNum)
- int ContNum; /* relative to FirstCont */
- {
- if (ContNum == CONTLAST)
- return;
-
- SaveFirstCont = FirstContour;
-
- DrawContBox(CurContour, NORMALPEN );
- DrawContBox(ContNum, HIGHLIGHTPEN );
-
- CurContour = ContNum;
- SetContTitle(ContNum);
- }
-
- SetContourHeight(gadget)
- struct Gadget *gadget;
- {
- struct PropInfo *PropInfo;
- ULONG VertPot;
- SHORT *Contour;
- int ContNum;
-
- PropInfo = (struct PropInfo *) gadget->SpecialInfo;
-
- VertPot = PropInfo->VertPot;
-
- VertPot ^= 0xffff;
- VertPot += 1;
-
- ContNum = GADG_NUM(gadget->GadgetID);
- Contour = CurPict->Heights + FirstContour + ContNum;
-
- if (*Contour <= Ceiling)
- *Contour = VertPot * Ceiling >> 16;
-
- SetCurCont(ContNum);
- }
-
- /*
- * Set the contour window's new title
- */
- SetContTitle(ContNum)
- int ContNum;
- {
- register SHORT Low, High;
- register SHORT *Contour;
- register UBYTE *Color;
-
- register char *fmt1 = "C: %-3d P: %-2d H: %3d-%d";
- register char *fmt2 = "C: %-3d P: %-2d H: %3d";
-
- ContNum += FirstContour;
-
- Contour = CurPict->Heights + ContNum;
-
- Color = CurPict->Pens + ContNum;
-
- High = *Contour;
-
- if (ContNum != 0) {
- Low = *(Contour - 1);
-
- if (Low == High || Low - High == 1) {
- sprintf(ContTitle, fmt2, ContNum, *Color, High);
- } else {
- if (Low < High)
- sprintf(ContTitle, fmt2, ContNum, *Color, High);
- else
- sprintf(ContTitle, fmt1, ContNum, *Color, Low - 1, High);
- }
- } else {
-
- sprintf(ContTitle, fmt2, ContNum, *Color, High);
- }
- SetWindowTitles(ContWind, ContTitle, NULL);
- }
-
- /*
- * Set Selection's pen
- */
- DrawContBox(Contour, pen)
- int Contour;
- LONG pen;
- {
- register LONG Left, Right, Top, Bottom;
- register struct RastPort *Rp = ContWind->RPort;
-
- static LONG LastCont;
-
- int Cont;
-
- if ( pen == NORMALPEN ) {
-
- Cont = LastCont;
- } else {
-
- LastCont = Cont = Contour + SaveFirstCont - FirstContour;
- }
-
- if (Cont >= 0 && Cont < DISPCONTS) {
-
- Left = (6 << XScale) * Cont + CurH->PenLeft - 1;
- Right = Left + (4 << XScale) + 2 + XScale;
-
- Top = CurV->PenTop - 1;
- Bottom = Top + (4 << YScale) + 2 + YScale;
-
- SetDrMd(Rp, (LONG) JAM1);
- SetAPen(Rp, pen);
- /*
- * Draw the new box
- */
- Move(Rp, Left, Top );
- Draw(Rp, Right, Top );
-
- if (pen == HIGHLIGHTPEN) SetAPen( Rp, SHADOWPEN );
-
- Draw(Rp, Right, Bottom);
- Draw(Rp, Left, Bottom);
-
- SetAPen( Rp, (long) pen );
-
- Draw(Rp, Left, Top+1 );
- }
- } /* DrawContBox */
-
- /*
- * There was a window pick. Do what we need to do to service it
- */
- DoWindowPick(Pict,MouseX,MouseY)
- register struct Picture *Pict;
- register SHORT MouseX,MouseY;
- {
- register struct Window *Window = CurPict->Window;
- register USHORT Height;
-
- if (Pict->Flags & NO_RAM_GENERATE)
- return;
-
- Height = HeightPicked( Pict, MouseX, MouseY );
- *(CurPict->Heights + CurContour + FirstContour) = Height;
- ModAll();
- }
-
- int
- HeightPicked( Pict, MouseX, MouseY )
- register struct Picture *Pict;
- register SHORT MouseX,MouseY;
- {
- return( *(Pict->Counts + (MouseY - Pict->TopMarg) * Pict->CountX +
- MouseX - Pict->LeftMarg));
- }
-
- /*
- * Smooth the heights over a subrange of contours
- */
- SmoothContours(First,Second)
- int First;
- int Second;
- {
- register USHORT Temp;
- register SHORT *StartP,*EndP;
- register float Diff,Start;
-
- First += SaveFirstCont;
- Second = ContNum(Second);
-
- if (Second-First != 0) {
-
- if (Second < First) {
- Temp = First;
- First = Second;
- Second = Temp;
- }
-
- StartP = CurPict->Heights + First;
- EndP = CurPict->Heights + Second;
-
- Start = (float) *StartP;
- Diff = ((float) *EndP - Start) / (float) (Second-First);
-
- if (Diff > -1.0) {
- Diff = -1.0;
- }
-
- for ( ; First < Second && Start > 0; First++)
- *(StartP++ + 1) = (SHORT) (Start += Diff);
-
- if (Start == 0) {
- for ( ; First < NumContours; First++) {
- *StartP++ = 0;
- }
- }
-
- ModAll();
- }
- } /* SmoothContours */
-
- /*
- * Copy the pattern from the palette into pattern area
- */
- CopyPattern(First,Second)
- int First, Second;
- {
- register int i, spacing;
- register UBYTE *ColorPatt = CurPict->Pens;
- register struct StringInfo *String =
- (struct StringInfo *) ModGadget->SpecialInfo;
-
- LONG Spacing;
-
- UBYTE *Last = ColorPatt + NUMCONTS;
-
- sscanf( String->Buffer, "%d", &Spacing );
- spacing = Spacing;
-
- if ( spacing <= 0 ) {
- return;
- }
-
- First += SaveFirstCont;
- Second = ContNum(Second);
-
- ColorPatt += First;
-
- if (First < Second) {
-
- PattSize = Second - First + 1;
- } else {
-
- PattSize = First - Second + 1;
- spacing = -spacing;
- }
-
- for ( i = 0; i < PattSize && ColorPatt >= CurPict->Pens && ColorPatt < Last;
- i++ ) {
-
- Pattern[ i ] = *ColorPatt;
- ColorPatt += spacing;
- }
- PattSize = i;
- } /* CopyPattern */
-
- /*
- * Set the pattern register to a list of consecutive pens
- */
- SetPenPattern(First,Second)
- register int First, Second;
- {
- register LONG i, spacing;
-
- PattSize = Second - First;
-
- if ( PattSize < 0 ) {
- PattSize = - PattSize;
- spacing = -1;
- } else {
- spacing = 1;
- }
- PattSize += 1;
-
- for ( i = 0; i < PattSize; i++) {
- Pattern[ i ] = First;
- First += spacing;
- }
- } /* SetPenPattern */
-
- /*
- * Paste the pattern from the palette
- */
- PastePattern(First,Second)
- register int First, Second;
- {
- register int i, Spacing;
- register UBYTE *ColorPatt = CurPict->Pens;
- register struct StringInfo *String =
- (struct StringInfo *) ModGadget->SpecialInfo;
-
- LONG spacing;
-
- register UBYTE *Last = ColorPatt + NUMCONTS;
-
- if ( PattSize == 0 )
- return;
-
- sscanf( String->Buffer, "%d", &spacing );
-
- Spacing = spacing;
-
- if ( Spacing < 1 )
- return;
-
- First += SaveFirstCont;
- ColorPatt += First;
- Second = ContNum(Second);
-
- if (First < Second ) {
-
- for ( i = 0; First <= Second && ColorPatt < Last;
- First += Spacing, i++ ) {
-
- if ( i == PattSize )
- i = 0;
-
- *ColorPatt = Pattern[ i ];
-
- ColorPatt += Spacing;
- }
- } else {
-
- if (Second == 0) Second = 1;
-
- for ( i = 0; Second < First && ColorPatt >= CurPict->Pens;
- First -= Spacing, i++ ) {
-
- if ( i == PattSize )
- i = 0;
-
- *ColorPatt = Pattern[ i ];
-
- ColorPatt -= Spacing;
- }
- }
- DrawColorBox( ScaledFirst );
- DrawColorBar();
- ReDispPens();
- } /* PastePattern */
-
- /*
- * Delete some contours from the contour list
- */
- DeleteContours(First,Second)
- register int First, Second;
- {
- register USHORT Temp;
- register UBYTE *StartCP, *EndCP;
- register int Size,i;
-
- struct StringInfo *String =
- (struct StringInfo *) ModGadget->SpecialInfo;
-
- LONG spacing;
-
- sscanf( String->Buffer, "%d", &spacing );
-
- if ( spacing < 1 )
- return;
-
- First += SaveFirstCont;
- Second = ContNum(Second);
- Size = Second - First;
-
- if (Size) {
-
- if (Size < 0) {
- Temp = First;
- First = Second;
- Second = Temp;
-
- Size = -Size;
- Temp = Size % spacing;
- First += Temp;
- }
-
- StartCP = CurPict->Pens + First;
-
- if (spacing == 1) {
- EndCP = CurPict->Pens + Second;
-
- Second = NUMCONTS - Second;
-
- for (i = 0; i < Second; i++) {
- *StartCP++ = *EndCP++;
- }
- } else {
- EndCP = StartCP + 1;
-
- for ( ; First < Second; First += spacing ) {
- for ( i = 0; i < spacing - 1; i++) {
- *StartCP++ = *EndCP++;
- }
- EndCP++;
- }
- }
-
- while ( StartCP < CurPict->Pens + NUMCONTS ) {
- *StartCP++ = NORMALPEN;
- }
-
- DrawColorBox( ScaledFirst );
- DrawColorBar();
- ReDispPens();
- ModAll();
- }
- } /* DeleteContours */
-
- /*
- * ReDisplay all the contour potentiometer gadgets
- */
- ModAll()
- {
- register SHORT i;
- register USHORT VertPot;
- register USHORT Height;
- register USHORT PrevHeight;
-
- register struct Gadget *PropGad = (struct Gadget *) ContGadget[0];
- register struct Picture *Pict = CurPict;
-
- if (Ceiling > 0) {
-
- if (FirstContour == 0) {
-
- PrevHeight = Pict->Heights[ 0 ] + 1;
-
- } else {
-
- for (i = 0; i < FirstContour - 1; i++) {
-
- Height = Pict->Heights[ i ];
-
- if (Height < PrevHeight) {
- PrevHeight = Height;
- }
- }
- }
-
- for (i = 0; i < DISPCONTS; i++) {
-
- Height = CurPict->Heights[ i + FirstContour ];
-
- SetPotPen( PropGad, PrevHeight, Height );
-
- if (Height < PrevHeight)
- PrevHeight = Height;
-
- if ( Height < Ceiling) {
-
- VertPot = (Height<<16)/Ceiling;
- if (VertPot > 0)
- VertPot--;
- VertPot ^= 0xffff;
- } else
-
- VertPot = (USHORT) 0;
-
- NewModifyProp( PropGad, ContWind, NULL, FREEVERT|PROPBORDERLESS, 0L,
- (long) VertPot, 0L, 0xffff/Ceiling, 1L);
-
- PropGad = PropGad->NextGadget;
- }
- }
- } /* ModAll */
-
- /*
- * ReDisplay all the contour potentiometer gadgets
- */
- ShowValid()
- {
- register SHORT i;
- register USHORT Height;
- register USHORT PrevHeight;
-
- register struct Gadget *PropGad = (struct Gadget *) ContGadget[0];
- register struct Picture *Pict = CurPict;
-
- if (Ceiling > 0) {
-
- if (FirstContour == 0)
- PrevHeight = Pict->Heights[ 0 ] + 1;
- else
- PrevHeight = Pict->Heights[ FirstContour - 1 ];
-
- for (i = 0; i < DISPCONTS; i++) {
-
- Height = CurPict->Heights[ i + FirstContour ];
-
- if (SetPotPen( PropGad, PrevHeight, Height )) {
- RefreshGList( PropGad, ContWind, NULL, 1);
- }
-
- if (Height < PrevHeight)
- PrevHeight = Height;
-
- PropGad = PropGad->NextGadget;
- }
- }
- } /* ShowValid */
-
- SetPotPen( PropGad, PrevHeight, Height )
- register struct Gadget *PropGad;
- register USHORT PrevHeight;
- register USHORT Height;
- {
- register int place,color;
- register struct Image *Image;
- extern int Num_vp_Colors;
-
- Image = (struct Image *) PropGad->GadgetRender;
-
- if (Height >= PrevHeight || Num_vp_Colors == 2)
- color = SHADOWPEN;
- else
- color = HIGHLIGHTPEN;
-
- if (Image->PlaneOnOff != color) {
- place = RemoveGadget( ContWind, PropGad );
- Image->PlaneOnOff = color;
- AddGadget( ContWind, PropGad, place );
- return(1);
- }
- return(0);
- }
-
- /*
- * ReDisplay all the pens gadgets
- */
- ReDispPens()
- {
- struct Gadget **Gadget = SelGadget;
-
- register LONG Left = (*Gadget)->LeftEdge;
- register LONG Top = (*Gadget)->TopEdge;
- register LONG Bot = Top + (4 << YScale) - 1;
-
- register LONG sixx = 6 << XScale;
- register LONG fourx = (4 << XScale) - 1;
-
- register struct Image *Image;
-
- LONG i;
- struct RastPort *Rp = ContWind->RPort;
- UBYTE *Pen = CurPict->Pens + FirstContour;
-
- for (i = 0; i < DISPCONTS; i++) {
-
- Image = (struct Image *) (*Gadget)->GadgetRender;
-
- Image = Image->NextImage;
-
- SetAPen( Rp, (long) (Image->PlaneOnOff = *Pen++) );
-
- RectFill( Rp, Left, Top, Left + fourx, Bot);
-
- Left += sixx;
-
- Gadget++;
- }
-
- SetContTitle( 0 );
- }
-
- static LONG WindowWidth;
- static LONG WindowHeight;
-
- static struct Border *BarBorder;
- static struct Border *PenBorder;
- static struct Border *ClnBorder;
-
- /*
- * Allocate all the gadgets and things for the contour window
- */
- struct Gadget *MakeContours()
- {
- struct Gadget *FirstGadget;
- struct PropInfo *PropInfo;
-
- register struct Gadget *NextGadget;
- register struct IntuiText *Intui;
-
- register ULONG i,x,y;
- register ULONG c = 0;
-
- int fourx = 4 << XScale;
- int foury = 4 << YScale;
- LONG sixx = 6 << XScale;
- LONG sixy = 6 << YScale;
-
- int Left,Top,Width;
-
- char *str;
-
- if ( XScale )
- CurH = &Horiz_II;
- else
- CurH = &Horiz_I;
-
- if ( YScale )
- CurV = &Verticle_II;
- else
- CurV = &Verticle_I;
-
- FirstContour = 0;
- SaveFirstCont = 0;
-
- PenBorder = ClnBorder = BarBorder = NULL;
-
- BarBorder = ShadowBorder( BEVELEDUP, CurH->BarLeft - 4, CurV->BarTop - 2,
- CurH->BarWidth, CurV->BarHeight);
- if (BarBorder == NULL) goto error;
-
- PenBorder = ShadowBorder( BEVELEDUP, CurH->PenLeft - 4, CurV->PenTop - 3,
- CurH->PenWidth, CurV->PenHeight);
- if (PenBorder == NULL) goto error;
-
- Left = CurH->PenLeft + CurH->PenWidth + 2;
-
- ClnBorder = ShadowBorder( BEVELEDUP, Left, CurV->PenTop-3,
- fourx + 5, CurV->PenHeight);
- if (ClnBorder == NULL) goto error;
-
- FirstGadget = NextGadget = MakePot( Left + 3, 30 << YScale,
- fourx, 32 << YScale, CONTCEIL, 0);
- if (NextGadget == NULL) goto error;
-
- NextGadget->Activation = GADGIMMEDIATE | FOLLOWMOUSE | RELVERIFY;
-
- Left = CurH->CmdLeft;
- Top = CurV->CmdTop;
-
- for (x = 0; x < 6; x++) {
-
- switch (x) {
- case 0: str = "Paint"; break;
- case 1: str = "Set"; break;
- case 2: str = "Smooth"; break;
- case 3: str = "Cut"; break;
- case 4: str = "Copy"; break;
- case 5: str = "Paste"; break;
- }
-
- Width = 8 * strlen( str ) + 6;
-
- NextGadget = NextGadget->NextGadget =
- MakeBool( Left, Top, Width, 13, NORMALPEN, CONTCNTL+x, NULL);
-
- if (NextGadget == NULL) goto error;
-
- Intui = NextGadget->GadgetText = ShadowIntui( str, 4, 3);
-
- if (Intui == NULL) goto error;
-
- Left += 4 + Width;
- }
-
- /* Set up color bar below command gadgets */
-
- BarBoxTop = CurV->BarTop;
- BarTop = BarBot = BarBoxTop + 1;
- BarBot += 4 << YScale;
- BarBoxBot = BarBot + 1;
-
- BarLeft = BarRight = CurH->BarLeft;
- BarRight += 256 << XScale;
- BarWidth = (DISPCONTS) << XScale;
-
- Width = 8 * strlen("Last") + 4;
-
- Top = CurV->PenTop;
-
- NextGadget = NextGadget->NextGadget =
- MakeBool( BarRight - Width + (2 << XScale), CurV->PenTop - 4, Width, 13,
- NORMALPEN, CONTLAST, NULL);
-
- if (NextGadget == NULL) goto error;
-
- Intui = NextGadget->GadgetText = ShadowIntui( "Last", 3, 3);
-
- if (Intui == NULL) goto error;
-
- NextGadget->GadgetText = Intui;
-
- i = CurH->PenLeft;
-
- /* Make Set of Gadgets */
-
- for (x = i, y = 0; y < DISPCONTS; x += sixx, y++) {
-
- SelGadget[y] = NextGadget = NextGadget->NextGadget =
- MakeBool(x, Top, fourx, foury, CurPict->Pens[ y + FirstContour ],
- CONTSEL+y, GADGIMAGE );
-
- if (NextGadget == NULL) goto error;
- }
-
- Top += sixy;
-
- FirstGadget->TopEdge = Top;
-
- Ceiling = CurPict->MaxIteration;
-
- /*
- * Allocate the potentiometer gadgets for contour window
- */
- for (x = i, y = 0; y < DISPCONTS; x += sixx, y++) {
-
- ContGadget[y] = NextGadget = NextGadget->NextGadget =
- MakePot(x, Top, 4 << XScale, 32 << YScale, CONTPOT+y, y);
-
- if (NextGadget == NULL) goto error;
-
- NextGadget->Activation = GADGIMMEDIATE | FOLLOWMOUSE | RELVERIFY;
-
- c = CurPict->Heights[ y ];
-
- if ( c < Ceiling )
- c = (ULONG) ((((Ceiling - ( c + 1 ))<<16)/(Ceiling)) & 0xffff);
- else
- c = (ULONG) 0;
-
- PropInfo = (struct PropInfo *) NextGadget->SpecialInfo;
-
- PropInfo->VertPot = c;
- PropInfo->VertBody = (USHORT) 0xffff/1024;
- }
-
- Top += 34 << YScale;
-
- ModGadget = NextGadget = NextGadget->NextGadget =
- MakeString( -28, -12 , 3, 0, "1" );
-
- if ( NextGadget == NULL ) goto error;
-
- NextGadget->Flags |= GRELBOTTOM | GRELRIGHT;
- NextGadget->GadgetText = Intui = ShadowIntui( "Mod", 0, -11 );
-
- if ( Intui == NULL ) goto error;
-
- WindowHeight = CurV->PenTop + CurV->PenHeight + (2 << YScale);
-
- if (XScale) {
- WindowWidth = 534;
- } else {
- WindowWidth = 271;
- }
- return( FirstGadget );
-
- error:
- FreeBorder( BarBorder );
- FreeBorder( PenBorder );
- FreeBorder( ClnBorder );
- FreeGadgets( FirstGadget );
- return( NULL );
-
- } /* MakeContours */
-
- static struct Gadget *ContGadgets;
-
- /*
- * Open the Contour window
- */
- int
- OpenContWind()
- {
- register struct Gadget *gadgets;
- register struct RastPort *Rp;
-
- if (CurPict == NULL)
- return;
-
- if (ContWind == NULL) {
-
- gadgets = MakeContours();
-
- if (gadgets == NULL) {
- DispErrMsg("Can't allocate contour gadget chain",0);
- return(0);
- }
- ContWind = OpenMyWind(&NewCont, screen, NULL, WindowWidth,
- WindowHeight);
-
- if (ContWind == NULL) {
- FreeGadgets(gadgets);
- return(0);
- }
- Rp = ContWind->RPort;
-
- SetAPen( Rp, NORMALPEN );
- RectFill( Rp, LEFTMARG, TOPMARG, WindowWidth, WindowHeight);
-
- ContGadgets = gadgets;
-
- BorderWindow( ContWind );
-
- DrawBorder( Rp, BarBorder, 0L, 0L );
- DrawBorder( Rp, PenBorder, 0L, 0L );
- DrawBorder( Rp, ClnBorder, 0L, 0L );
-
- FreeBorder( BarBorder );
- FreeBorder( PenBorder );
- FreeBorder( ClnBorder );
-
- AddGList( ContWind, gadgets, -1L, -1L);
-
- SetContTitle(0);
-
- DrawColorBar();
- DrawContBox( CurContour, HIGHLIGHTPEN );
-
- RefreshGadgets( ContWind->FirstGadget, ContWind, NULL );
- ModAll();
- } else {
-
- WindowToFront( ContWind );
- }
- ContOpen = 1;
- return( 1 );
- } /* OpenContWind */
-
- /*
- * Close the Mand window
- */
- CloseContWind()
- {
- if (ContWind != NULL) {
-
- NewCont.LeftEdge = ContWind->LeftEdge;
- NewCont.TopEdge = ContWind->TopEdge;
-
- CloseMyWind(ContWind,ContGadgets);
- }
- ContWind = NULL;
- } /* ClosePalWind */
-
-